package com.cskaoyan.javase.wrapper;

import javax.xml.transform.sax.SAXTransformerFactory;

/**
 * 包装类型的自动拆装箱
 *
 * 包装类型对象在使用上，在绝大多数情况下，是和它对应的基本数据类型是没有区别的。
 * 这依赖于Java"自动拆装箱"机制。
 *
 * 拆箱和装箱的概念：
 * 1. 在Java当中，把基本数据类型变量，转换为其对应包装类的引用数据类型变量，称之为"装箱"。
 * 2. 在Java当中，把包装类的引用数据类型类型变量，转换为其对应基本数据类型变量，称之为"拆箱"。
 * 实际代码使用中，Java中的"拆箱"和"装箱"都是自动进行的，基本数据类型变量和它的包装类引用数据类型变量，可以自由、自动的互相转换。
 *
 * 当然，所谓自动拆装箱也并不是十分高端的语法设计，实际上是依赖于底层自动调用方法去实现的。
 *
 * 自动装箱和拆箱其实是一种语法糖，在底层自动调用了方法而已：
 *
 * 1. 自动装箱依赖于，包装类型类名.valueOf(对应基本数据类型值)
 *    比如：
 *        Integer i = Integer.valueOf(123);
 *    在代码中出现上述写法，就会警告：
 *    Unnecessary boxing 'Integer.valueOf(123)'
 *    即装箱是自动，无需再手动调用方法。
 * 2. 自动拆箱依赖于，包装类型对象名.基本数据类型名Value()
 *    比如：
 *    注：这里的i就是上面出现的Integer i引用。
 *        int num = i.intValue();
 *    在代码中出现上述写法，也一样会警告：
 *    // Unnecessary unboxing 'i.intValue()'
 *    即拆箱是自动，无需再手动调用方法。
 *
 * 自动拆装箱意味着，多数情况下，基本数据类型和它的包装类可以混用（当然也有不能混用的情况）
 *
 * 比较典型的不能混用的情况就是集合，集合只能存储对象，不能存储基本数据类型变量。
 *
 * 所以集合当中的包装类型以及它的对应基本数据类型，就是不能混用的！
 *
 * @since 21:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo4 {
    public static void main(String[] args) {
        Integer a = 100;
        // Unnecessary boxing 'Integer.valueOf(100)'
        Integer i = Integer.valueOf(100);

        // Unnecessary unboxing 'i.intValue()'
        int u = i.intValue();

        int num = a;

        getMax(new int[0]);
    }

    public static Integer getMax(int[] arr) {
        // arr可能是一个长度为0的数组,也可能是一个null,不是正常数组
        if (arr == null || arr.length == 0) {
            System.out.println("请输入正常数组!");
            // 这里又要结束方法,又不好给出一个int返回值
            /*
                碰到这种情况,有两种解决方案:
                    1.最常用的是用异常解决,直接在这里抛出异常,结束方法
                    2.将包装类型作为返回值,从而有特殊取值null(这不常用)
             */
            return null;
        }

        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}
